//
//  XPAudio.swift
//  PPKit
//
//  Created by xiaopin on 2019/7/23.
//  Copyright © 2019 PPKit. All rights reserved.
//  https://gitee.com/xiaopindev/PPKit
//  https://github.com/xiaopindev
//  https://xiaopin.cnblogs.com
//
/*
 这个类封装了音频相关的操作
 1.播放简单声音、音效、震动
 2.播放音乐和较长声音
 3.录音和播放相关
 */
import UIKit
import AudioToolbox
import AVFAudio

/// 音频操作工具类
class XPAudio {
    //MARK: 单例类写法
    static let shared = XPAudio()
    private init(){}
    
    //MARK: 简单声音、音效、震动操作相关
    /// 播放声音
    /// - Parameters:
    ///   - name: 小于30秒的本地声音文件名称
    ///   - type: 文件格式：CAF、AIF、WAV(使用PCM或IMA/ADPCM数据)格式  mp3,aac
    ///   - alert: 是否待振动提醒：true 带振动, false系统声音
    ///   - completion: 播放完回调
    func playSound(name:String?, type:String?, alert:Bool = false, completion:(()->())? = nil){
        /*
         1.音频长度小于30秒
         2.格式只能是PCM或者IMA4
         3.文件必须被存储为.caf、.aif、或者.wav格式, mp3,aac
         4.简单音频不能从内存播放，而只能是磁盘文件
         */
        //1.构建文件路径
        guard let path = Bundle.main.path(forResource: name, ofType: type) else{return}
        let soundUrl = URL(fileURLWithPath: path) as CFURL
        
        //2.创建声音
        var soundID:SystemSoundID = 0
        AudioServicesCreateSystemSoundID(soundUrl, &soundID)
        
        //3.播放和释放资源
        if alert {
            //播放声音带振动提醒
            AudioServicesPlayAlertSoundWithCompletion(soundID) {
                //释放资源
                AudioServicesDisposeSystemSoundID(soundID)
                completion?()
            }
        }else{
            //只播放声音
            AudioServicesPlaySystemSoundWithCompletion(soundID) {
                //释放资源
                AudioServicesDisposeSystemSoundID(soundID)
                completion?()
            }
        }
    }

    /// 手机振动
    /// - Parameter completion: 振动完回调
    func vibrate(completion:(()->())? = nil){
        //执行振动
        AudioServicesPlaySystemSoundWithCompletion(kSystemSoundID_Vibrate) {
            //释放资源
            AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate)
            completion?()
        }
    }
    
    //MARK: 播放音乐和长度
    /// 允许后台播放
    func allowPlaybackground(){
        //音视频初始化
        let audioSession = AVAudioSession.sharedInstance()
        try? audioSession.setCategory(.playback)
    }
    
    //MARK: 录音相关
    
    //MARK: 音频转换
    func wav2mp3(){
        
    }
    
    func caf2mp3(){
        
    }
}
